//<p>给定一个二叉树</p>
//
//<pre>
//struct Node {
//  int val;
//  Node *left;
//  Node *right;
//  Node *next;
//}</pre>
//
//<p>填充它的每个 next 指针，让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点，则将 next 指针设置为 <code>NULL</code>。</p>
//
//<p>初始状态下，所有 next 指针都被设置为 <code>NULL</code>。</p>
//
//<p> </p>
//
//<p><strong>进阶：</strong></p>
//
//<ul>
//	<li>你只能使用常量级额外空间。</li>
//	<li>使用递归解题也符合要求，本题中递归程序占用的栈空间不算做额外的空间复杂度。</li>
//</ul>
//
//<p> </p>
//
//<p><strong>示例：</strong></p>
//
//<p><img alt="" src="https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/02/15/117_sample.png" style="height: 218px; width: 640px;" /></p>
//
//<pre>
//<strong>输入</strong>：root = [1,2,3,4,5,null,7]
//<strong>输出：</strong>[1,#,2,3,#,4,5,7,#]
//<strong>解释：</strong>给定二叉树如图 A 所示，你的函数应该填充它的每个 next 指针，以指向其下一个右侧节点，如图 B 所示。序列化输出按层序遍历顺序（由 next 指针连接），'#' 表示每层的末尾。</pre>
//
//<p> </p>
//
//<p><strong>提示：</strong></p>
//
//<ul>
//	<li>树中的节点数小于 <code>6000</code></li>
//	<li><code>-100 <= node.val <= 100</code></li>
//</ul>
//
//<p> </p>
//
//<ul>
//</ul>
//<div><div>Related Topics</div><div><li>树</li><li>深度优先搜索</li><li>广度优先搜索</li><li>二叉树</li></div></div><br><div><li>👍 499</li><li>👎 0</li></div>
  
package leetcode.editor.cn;

public class _117_PopulatingNextRightPointersInEachNodeIi{
    public static void main(String[] args) {
         Solution solution = new _117_PopulatingNextRightPointersInEachNodeIi().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}
    
    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/

class Solution {
    public Node connect(Node root) {
        if (root==null) {
            return null;
        }
        Node cur = root;
        while (cur != null) {
            Node dummy = new Node(0);
            Node pre = dummy;
            while (cur!=null){
                if (cur.left!=null) {
                    pre.next = cur.left;
                    pre = pre.next;
                }
                if (cur.right!=null) {
                    pre.next = cur.right;
                    pre = pre.next;
                }
                cur = cur.next;
            }
            cur = dummy.next;
        }
        return root;
    }
}

    class Node {
        public int val;
        public Node left;
        public Node right;
        public Node next;

        public Node() {}

        public Node(int _val) {
            val = _val;
        }

        public Node(int _val, Node _left, Node _right, Node _next) {
            val = _val;
            left = _left;
            right = _right;
            next = _next;
        }
    };
//leetcode submit region end(Prohibit modification and deletion)

}